﻿// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable disable

using System.Collections;

namespace System.Windows.Forms.Tests;

public class BaseCollectionTests
{
    [WinFormsFact]
    public void BaseCollection_Ctor_Default()
    {
        SubBaseCollection collection = new();
        Assert.Throws<NullReferenceException>(() => collection.Count);
        Assert.False(collection.IsReadOnly);
        Assert.False(collection.IsSynchronized);
        Assert.Null(collection.List);
        Assert.Same(collection, collection.SyncRoot);
    }

    [WinFormsFact]
    public void BaseCollection_Count_GetWithList_ReturnsExpected()
    {
        CustomBaseCollection collection = new([1, 2, 3]);
        Assert.Equal(3, collection.Count);
    }

    [WinFormsFact]
    public void BaseCollection_CopyTo_InvokeWithList_Success()
    {
        CustomBaseCollection collection = new([1, 2, 3]);
        object[] array = [0, 0, 0, 0, 4];
        collection.CopyTo(array, 1);
        Assert.Equal([0, 1, 2, 3, 4], array);
    }

    [WinFormsFact]
    public void BaseCollection_CopyTo_InvokeDefault_ThrowsNullReferenceException()
    {
        BaseCollection collection = new();
        Assert.Throws<NullReferenceException>(() => collection.CopyTo(Array.Empty<object>(), 0));
    }

    [WinFormsFact]
    public void BaseCollection_GetEnumerator_InvokeWithList_Success()
    {
        CustomBaseCollection collection = new([1, 2, 3]);
        IEnumerator enumerator = collection.GetEnumerator();
        Assert.True(enumerator.MoveNext());
        Assert.Equal(1, enumerator.Current);
    }

    [WinFormsFact]
    public void BaseCollection_GetEnumerator_InvokeDefault_ThrowsNullReferenceException()
    {
        BaseCollection collection = new();
        Assert.Throws<NullReferenceException>(() => collection.CopyTo(Array.Empty<object>(), 0));
    }

    private class CustomBaseCollection : BaseCollection
    {
        private readonly ArrayList _list;

        public CustomBaseCollection(ArrayList list) => _list = list;

        protected override ArrayList List => _list;
    }

    private class SubBaseCollection : BaseCollection
    {
        public new ArrayList List => base.List;
    }
}
